home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / MATH / MFLOAT10.ZIP / PI.CPP < prev    next >
C/C++ Source or Header  |  1993-04-28  |  3KB  |  124 lines

  1. /* *** Here are some methods demonstrated to calculate the number pi */
  2.  
  3. /* if you use the mfloat-library use 'pi.prj', otherwise dont use the */
  4. /* project file */
  5.  
  6. #define use_mfloat
  7.  
  8. extern unsigned _stklen = 40000U;
  9.  
  10. #include <conio.h>
  11. #include <iomanip.h>
  12.  
  13. #ifdef use_mfloat
  14. #include "mfloat.cxx"                   // use the mfloat-library
  15. #define digits 77                       // # of output digits
  16. #else
  17. #include <math.h>                       // use the standard library
  18. #define mfloat double                   // use 'normal' float
  19. #define setmantissawords(v)             // ignore setmantissawords()
  20. #define getmantissawords() 5            // replacement for getmantissawords()
  21. #define digits 40                       // # of output digits
  22. double pi = 2 * acos(0);
  23. #endif
  24.  
  25. mfloat a,b,c,bound;
  26. int i;
  27. char ch[100];
  28.  
  29. int main(void) {
  30.   clrscr;
  31.   setmantissawords(15);
  32.   bound = ldexp((mfloat) 1, -16 * getmantissawords() - 16);
  33.  
  34.   cout << "                            Calculation of PI\n";
  35.   cout << "                            =================\n";
  36.   cout << "\n\n";
  37.   cout << "PI = 16 * arctan(1 / 5) - 4 * arctan(1 / 239) :\n";
  38.   a = (mfloat) 16 / 5;
  39.   b = a;
  40.   i = 0;
  41.   do {
  42.     i++;
  43.     b /= 5*5;
  44.     c = b / (2 * i + 1);
  45.     if (i & 1)
  46.       a -= c;
  47.     else
  48.       a += c;
  49.   } while (bound <= c);
  50.   b = (mfloat) 4 / 239;
  51.   a -= b;
  52.   i = 0;
  53.   do {
  54.     i++;
  55.     b /= 239;
  56.     b /= 239;
  57.     c = b / (2 * i + 1);
  58.     if (i & 1)
  59.       a += c;
  60.     else
  61.       a -= c;
  62.   } while (bound <= c);
  63.   cout << setprecision(digits) << a << "\n\n";
  64.   cout << "*******************************************************************************\n\n";
  65.   cout << "PI = 48 * arctan(1 / 18)  + 32 * arctan(1 / 57) - 20 * arctan(1 / 239) :\n";
  66.   a = (mfloat) 8 / 3;
  67.   b = a;
  68.   i = 0;
  69.   do {
  70.     i++;
  71.     b /= 18*18;
  72.     c = b / (2 * i + 1);
  73.     if (i & 1)
  74.       a -= c;
  75.     else
  76.       a += c;
  77.   } while (bound <= c);
  78.   b = (mfloat) 32 / 57;
  79.   a += b;
  80.   i = 0;
  81.   do {
  82.     i++;
  83.     b /= 57*57;
  84.     c = b / (2 * i + 1);
  85.     if (i & 1)
  86.       a -= c;
  87.     else
  88.       a += c;
  89.   } while (bound <= c);
  90.   b = (mfloat) 20 / 239;
  91.   a -= b;
  92.   i = 0;
  93.   do {
  94.     i++;
  95.     b /= 239;
  96.     b /= 239;
  97.     c = b / (2 * i + 1);
  98.     if (i & 1)
  99.       a += c;
  100.     else
  101.       a -= c;
  102.   } while (bound <= c);
  103.   cout << setprecision(digits) << a << "\n\n";
  104.   cout << "*******************************************************************************\n\n";
  105.   cout << "PI = 6 * arctan(1 / sqrt(3)) :\n";
  106.   a = 2 * sqrt((mfloat) 3);
  107.   b = a;
  108.   i = 0;
  109.   do {
  110.     i++;
  111.     b /= 3;
  112.     c = b / (2 * i + 1);
  113.     if (i & 1)
  114.       a -= c;
  115.     else
  116.       a += c;
  117.   } while (bound <= c);
  118.   cout << setprecision(digits) << a << "\n\n";
  119.   cout << "*******************************************************************************\n\n";
  120.   cout << "Internal Pi:\n";
  121.   cout << setprecision(digits) << pi << "\n\n";
  122.   return(0);
  123. }
  124.